home *** CD-ROM | disk | FTP | other *** search
- #include "stralloc.h"
- #include "substdio.h"
- #include "getln.h"
- #include "hfield.h"
- #include "headerbody.h"
-
- static int getsa(ss,sa,match)
- substdio *ss;
- stralloc *sa;
- int *match;
- {
- if (!*match) return 0;
- if (getln(ss,sa,match,'\n') == -1) return -1;
- if (*match) return 1;
- if (!sa->len) return 0;
- if (!stralloc_append(sa,"\n")) return -1;
- return 1;
- }
-
- static stralloc line = {0};
- static stralloc nextline = {0};
-
- int headerbody(ss,dohf,hdone,dobl)
- substdio *ss;
- void (*dohf)();
- void (*hdone)();
- void (*dobl)();
- {
- int match;
- int flaglineok;
- match = 1;
- flaglineok = 0;
- for (;;)
- {
- switch(getsa(ss,&nextline,&match))
- {
- case -1:
- return -1;
- case 0:
- if (flaglineok) dohf(&line);
- hdone();
- /* no message body; could insert blank line here */
- return 0;
- }
- if (flaglineok)
- {
- if ((nextline.s[0] == ' ') || (nextline.s[0] == '\t'))
- {
- if (!stralloc_cat(&line,&nextline)) return -1;
- continue;
- }
- dohf(&line);
- }
- if (nextline.len == 1)
- {
- hdone();
- dobl(&nextline);
- break;
- }
- if (stralloc_starts(&nextline,"From "))
- {
- if (!stralloc_copys(&line,"MBOX-Line: ")) return -1;
- if (!stralloc_cat(&line,&nextline)) return -1;
- }
- else
- if (hfield_valid(nextline.s,nextline.len))
- {
- if (!stralloc_copy(&line,&nextline)) return -1;
- }
- else
- {
- hdone();
- if (!stralloc_copys(&line,"\n")) return -1;
- dobl(&line);
- dobl(&nextline);
- break;
- }
- flaglineok = 1;
- }
- for (;;)
- switch(getsa(ss,&nextline,&match))
- {
- case -1: return -1;
- case 0: return 0;
- case 1: dobl(&nextline);
- }
- }
-